/**
 * @file mqueue.h
 * Estruturas e funções relacionadas às filas de mensagens.
 */

#ifndef MQUEUE_H_
#define MQUEUE_H_

#include "job.h"

/**
 * Estrutura de uma mensagens a ser guardada na fila de mensagens.
 */
typedef struct msg {
	long type;		///< Tipo da mensagem.
	Job job;		///< Processo sendo agendado.
} Msg;

/**
 * Valores válidos para o campo type de uma mensagem.
 */
typedef enum msg_type {
	MSG_NONE = 0,		///< Mensagens do tipo zero não devem ser usadas.
	MSG_SUBMIT,			///< Agendar um novo job.
	MSG_REMOVE,			///< Remover um job agendado.
	MSG_LIST,			///< Listar todos os jobs agendados.
	MSG_TERM,			///< Terminar o deamon (executa_proc).
	MSG_LENGTH			///< Isto só serve para saber o tamanho desse enum.
} Msg_type;

/// Identificador da fila de mensagens para enviar ao deamon.
extern int mqin;

/// Identificador da fila de mensagens para receber resposta do deamon.
extern int mqout;

/**
 * Cria a fila de mensagens para envio ao executa_proc.
 *
 * @return O identificador da fila.
 *
 * Essa função deve ser chamada pelo deamon (executa_proc), para criar a fila de
 * mensagens e os outros processos poderem simplesmente usá-la.
 */
int mqueue_create_in();

/**
 * Cria a fila de mensagens para as respostas do executa_proc.
 *
 * @return O identificador da fila.
 *
 * Essa função deve ser chamada pelo deamon (executa_proc), para criar a fila de
 * mensagens e os outros processos poderem simplesmente usá-la.
 */
int mqueue_create_out();

/**
 * Obtém a fila de mensagens.
 *
 * @return O identificador da fila.
 *
 * Essa função deve ser usada nos outros processos (que não o deamon) para obter
 * a fila de mensagens que o deamon criou. Nessa fila de  mensagens devem estar
 * somente as mensagens que os outros processos enviam para o executa proc.
 */
int mqueue_obtain_in();

/**
 * Obtém a fila de mensagens.
 *
 * @return O identificador da fila.
 *
 * Essa função deve ser usada nos outros processos (que não o deamon) para obter
 * a fila de mensagens que o deamon criou. Nessa fila de mensagens devem estar
 * somente as mensagens que o executa_proc envia de volta para os outros
 * processos.
 */
int mqueue_obtain_out();

#endif /* MQUEUE_H_ */
